package com.itheima.stock.controller;

import com.itheima.stock.annotation.MyLog;
import com.itheima.stock.pojo.domain.SysUserDomain;
import com.itheima.stock.pojo.entity.SysUser;
import com.itheima.stock.service.UserService;
import com.itheima.stock.vo.req.*;
import com.itheima.stock.vo.resp.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author : itheima
 * @date : 2022/9/19 16:18
 * @description : 定义访问用户的服务接口
 */
@RestController
@RequestMapping("/api")
//@CrossOrigin
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 根据用户名查询用户信息
     *
     * @param userName
     * @return
     */
    @GetMapping("/{userName}")
    public SysUser getUserByUserName(@PathVariable("userName") String userName) {
        return userService.getUserByUserName(userName);
    }

    /**
     * 用户登录功能接口
     * 集成Spring Security后，注释
     * @param vo
     * @return
     */
//    @PostMapping("/login")
//    public R<AccessTokenLoginRespVo> login(@RequestBody LoginReqVo vo) {
//        return userService.login(vo);
//    }

    /**
     * 生成登录校验码的访问接口
     *
     * @return
     */
    @GetMapping("/captcha")
    public R<Map> getCaptchaCode() {
        return userService.getCaptchaCode();
    }

    /**
     * 多条件综合查询用户分页信息，条件包含：分页信息 用户创建日期范围
     *
     * @param reqVo
     * @return
     */
    @PostMapping("/users")
    @MyLog("组织管理-用户管理-分页查询用户接口")
    @PreAuthorize("hasAuthority('sys:user:list')")
    public R<PageResult<SysUserDomain>> getUserInfosByMCondition(@RequestBody UserMConditionReqVo reqVo) {
        return userService.getUserInfosByMCondition(reqVo);
    }

    /**
     * 添加用户信息  服务路径：/api/user
     *
     * @param reqVo
     * @return
     */
    @PostMapping("/user")
    public R addUser(@RequestBody SysUserAddReqVo reqVo, @RequestHeader("Authorization") String accessToken) {
        return userService.addUser(reqVo, accessToken);
    }

    /**
     * 获取用户具有的角色信息，以及所有角色信息
     *
     * @param userId
     */
    @GetMapping("/user/roles/{userId}")
    public R<Map<String, List>> getUserRolesAndAllRoles(@PathVariable String userId) {
        return userService.getUserRolesAndAllRoles(userId);
    }

    /**
     * 更新用户角色信息
     *
     * @param reqVo
     * @return
     */
    @PutMapping("/user/roles")
    public R updateUserRoles(@RequestBody UpdateUserRolesReqVo reqVo) {
        return userService.updateUserRoles(reqVo);
    }

    /**
     * 批量删除用户信息，delete请求可通过请求体携带数据
     *
     * @param userIds
     * @return
     */
    @DeleteMapping("/user")
    @PreAuthorize("hasAuthority('sys:user:delete')")
    public R deleteUsers(@RequestBody List<Long> userIds) {
        return userService.deleteUsers(userIds);
    }

    /**
     * 根据用户id查询用户信息
     *
     * @param userId
     * @return
     */
    @GetMapping("/user/info/{userId}")
    @MyLog("组织管理-用户管理-用户信息详情接口")
    public R<UserInfoRespVo> selectUserInfoById(@PathVariable String userId) {
        return userService.selectUserInfoById(userId);
    }

    /**
     * 根据id更新用户基本信息
     *
     * @param reqVo
     * @return
     */
    @PutMapping("/user")
    public R updateUserInfo(@RequestBody SysUserUpdateReqVo reqVo, @RequestHeader("Authorization") String accessToken) {
        return userService.updateUserInfo(reqVo, accessToken);
    }

}
